package com.itcast.rediscache.distributedLock.luaLock;

/**
 * @author zhangtian105
 * @ClassName DistributeLock.java
 * @projectName Redis
 * @Description 分布式锁
 * @createTime 2020年11月18日 14:39:00
 */
public interface DistributeLock {
    /**
     * 尝试加锁
     * @param lockName 锁的key
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean trylock(String lockName) ;

    /**
     * 尝试加锁 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param expireTime 过期时间 单位：秒
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean trylock(String lockName, int expireTime);

    /**
     * 尝试加锁 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param requestID 用户ID
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean trylock(String lockName, String requestID);

    /**
     * 尝试加锁 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param requestID 用户ID
     * @param expireTime 过期时间 单位：秒
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean trylock(String lockName, String requestID, int expireTime);

    /**
     * 尝试加锁，失败自动重试 会阻塞当前线程
     * @param lockName 锁的key
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean lock(String lockName);

    /**
     * 尝试加锁，失败自动重试 会阻塞当前线程 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param requestID 用户ID
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean lock(String lockName, String requestID);

    /**
     * 尝试加锁 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param expireTime 过期时间 单位：秒
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean lock(String lockName, int expireTime);

    /**
     * 尝试加锁 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param expireTime 过期时间 单位：秒
     * @param retryCount 重试次数
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean lock(String lockName, int expireTime, int retryCount);

    /**
     * 尝试加锁 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param requestID 用户ID
     * @param expireTime 过期时间 单位：秒
     * @return 加锁成功 返回uuid
     *          加锁失败 返回null
     * */
    boolean lock(String lockName, String requestID, int expireTime);

    /**
     * 尝试加锁 (requestID相等 可重入)
     * @param lockName 锁的key
     * @param expireTime 过期时间 单位：秒
     * @param requestID 用户ID
     * @param retryCount 重试次数
     * @return 加锁成功 返回true
     *          加锁失败 返回false
     * */
    boolean lock(String lockName, String requestID, int expireTime, int retryCount);

    /**
     * 功能描述: <br>
     * 〈锁续命〉
     * @Param: [lockName, requestID, expireTime]
     * @Return: boolean
     * @Author: zhangtian105
     * @Date: 2020/11/19 16:35
     */
    boolean lockWithLease(String lockName, String requestID, int expireTime);

    /**
     * 释放锁
     * @param lockName 锁的key
     * @param requestID 用户ID
     * @return true     释放自己所持有的锁 成功
     *          false    释放自己所持有的锁 失败
     * */
    boolean unLock(String lockName, String requestID);
}
